package work.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import sun.nio.cs.US_ASCII;
import work.entity.User;
import work.service.UserService;
import work.vo.DataVo;
import work.vo.UserVo;

import javax.jws.soap.SOAPBinding;
import java.util.List;

@RestController
@RequestMapping("/user")
public class UserHandler {

    @Autowired
    private UserService userService;

    // 登录功能
    // 传入用户对象，至少包含账号和密码
    @PostMapping("/login")
    public UserVo login(@RequestBody User user1) {
        UserVo userVo = new UserVo();

        try {
            // 通过id查询用户表，看是否存在该用户
            User user = userService.findById(user1.getUserId());

            // 用户表中不存在此用户
            if (user == null) {
                userVo.setCode(100);
                userVo.setMsg("该用户不存在！");
                return userVo;
            }
            // 密码错误
            if (!user.getUserPassword().equals(user1.getUserPassword())) {
                userVo.setCode(101);
                userVo.setMsg("密码错误");
                return userVo;
            }

            // 利用用户的状态使其跳转到不同的页面
            switch (user.getUserStatus()){
                case 0:     // 超级管理员
                    userVo.setCode(110);
                    break;
                case 1:     // 读者
                    userVo.setCode(111);
                    break;
                case 2:
                    userVo.setCode(112);
                    userVo.setMsg("该账号已注销！");
                    return userVo;
                case 3:     // 工作人员
                    userVo.setCode(113);
                    break;
                case 4:
                    userVo.setCode(114);
                    userVo.setMsg("该账号注册信息处理中！");
                    return userVo;
                case 5:
                    userVo.setCode(115);
                    userVo.setMsg("该账号已注销！");
                    return userVo;
            }
            userVo.setMsg("登录成功！");
            userVo.setUser(user);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            return userVo;
        }

    }

    // 注册功能处理
    // 传入user对象，全部元素必须都有
    @PostMapping("/register")
    public UserVo register(@RequestBody User user1) {
        UserVo userVo = new UserVo();

        try {
            // 账号已存在
            if (userService.findById(user1.getUserId()) != null) {
                userVo.setCode(120);
                userVo.setMsg("该用户已存在！请重新输入！");
                return userVo;
            }

            // 若 i 为 1，则说明数据库插入成功，即注册流程成功。若不为 1，则数据库插入数据不成功，注册失败
            int i = userService.register(user1);
            if (i == 0) {
                userVo.setCode(121);
                userVo.setMsg("注册失败！");
                return userVo;
            } else if (user1.getUserStatus() == 1) {
                userVo.setCode(122);
                userVo.setMsg("读者注册成功！");
            } else {
                userVo.setCode(123);
                userVo.setMsg("工作人员提交注册申请！");
            }
            userVo.setUser(user1);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            return userVo;
        }

    }

    // 修改个人信息（密码）
    // 前端传入一个user对象和新密码字符串
    @PostMapping("/changeInformation")
    public DataVo changeInformation(@RequestBody User user) {
        DataVo dataVo = new DataVo();

        int i = userService.updatePassword(user);
        if (i == 0) {
            dataVo.setCode(210);
            dataVo.setMsg("修改密码失败");
        } else {
            dataVo.setCode(211);
            dataVo.setMsg("修改密码成功");
        }
        return dataVo;
    }

    // 工作人员查询读者个人信息
    // 前端传入一个user对象，userId和userName可有数据也可为空，其余数据为空即可
    @PostMapping("/findUser")
    public DataVo findUser(@RequestBody User user) {
        DataVo dataVo = new DataVo();

        List<User> userList = userService.findUsers(user);

        if (userList.isEmpty()) {
            dataVo.setCode(0);
            dataVo.setMsg("不存在用户数据");
        } else {
            dataVo.setCode(1);
            dataVo.setMsg("存在用户数据");
            dataVo.setData(userList);
        }

        return dataVo;
    }

    // 超级管理员查询工作人员信息
    // 前端传入一个user对象，工作人员账号userId或工作人员姓名userName可为空也可不为空，支持模糊查询
    @PostMapping("/findWorkers")
    public DataVo findWorkers(@RequestBody User user) {
        DataVo dataVo = null;
        try {
            dataVo = new DataVo();

            List<User> userList = userService.findWorkers(user);

            if (userList.isEmpty()) {
                dataVo.setCode(390);
                dataVo.setMsg("系统没有工作人员记录");
            } else {
                dataVo.setCode(391);
                dataVo.setMsg("系统存在工作人员记录");
                dataVo.setData(userList);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            return dataVo;
        }
    }

    // 超级管理员管理工作人员注册申请
    // 前端传入一个user对象，userId不可为空，点击“通过”或“不通过”按键时设置userStatus的值，0表示不通过，1表示通过
    @PostMapping("/checkWorker")
    public DataVo checkWorker(@RequestBody User user) {
        DataVo dataVo = new DataVo();

//        if (user.getUserStatus() != 4) {
//            dataVo.setCode(400);
//            dataVo.setMsg("非注册工作人员，不可进行注册管理操作");
//            return dataVo;
//        }

        if (user.getUserStatus() == 0) {
            int i = userService.deleteWorker(user);
            if (i == 0) {
                dataVo.setCode(401);
                dataVo.setMsg("不通过失败");
            } else {
                dataVo.setCode(402);
                dataVo.setMsg("不通过成功");
            }
            return dataVo;
        } else {
            user.setUserStatus(3);
            int j = userService.updateStatus(user);
            if (j == 0) {
                dataVo.setCode(403);
                dataVo.setMsg("通过失败");
            } else {
                dataVo.setCode(404);
                dataVo.setMsg("通过成功");
            }
            return dataVo;
        }
    }

    // 超级管理员删除工作人员
    // 前端传入一个user对象，userId不可为空
    @PostMapping("/cancelWorker")
    public DataVo cancelWorker(@RequestBody User user) {
        DataVo dataVo = new DataVo();

        user.setUserStatus(5);
        int i = userService.updateStatus(user);

        if (i == 0) {
            dataVo.setCode(410);
            dataVo.setMsg("注销该工作人员失败");
        } else {
            dataVo.setCode(411);
            dataVo.setMsg("注销该工作人员成功");
        }

        return dataVo;
    }
}